{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implementation of Deep Convolutional GANs\n",
    "Reference: https://arxiv.org/pdf/1511.06434.pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Run the comment below only when using Google Colab\n",
    "# !pip install torch torchvision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "from torchvision import datasets\n",
    "from torchvision import transforms\n",
    "from torchvision.utils import save_image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import datetime\n",
    "import os, sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from matplotlib.pyplot import imshow, imsave\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "MODEL_NAME = 'DCGAN'\n",
    "DEVICE = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_sample_image(G, n_noise):\n",
    "    \"\"\"\n",
    "        save sample 100 images\n",
    "    \"\"\"\n",
    "    z = torch.randn(100, n_noise).to(DEVICE)\n",
    "    y_hat = G(z).view(100, 28, 28) # (100, 28, 28)\n",
    "    result = y_hat.cpu().data.numpy()\n",
    "    img = np.zeros([280, 280])\n",
    "    for j in range(10):\n",
    "        img[j*28:(j+1)*28] = np.concatenate([x for x in result[j*10:(j+1)*10]], axis=-1)\n",
    "    return img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Discriminator(nn.Module):\n",
    "    \"\"\"\n",
    "        Convolutional Discriminator for MNIST\n",
    "    \"\"\"\n",
    "    def __init__(self, in_channel=1, num_classes=1):\n",
    "        super(Discriminator, self).__init__()\n",
    "        self.conv = nn.Sequential(\n",
    "            # 28 -> 14\n",
    "            nn.Conv2d(in_channel, 512, 3, stride=2, padding=1, bias=False),\n",
    "            nn.BatchNorm2d(512),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            # 14 -> 7\n",
    "            nn.Conv2d(512, 256, 3, stride=2, padding=1, bias=False),\n",
    "            nn.BatchNorm2d(256),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            # 7 -> 4\n",
    "            nn.Conv2d(256, 128, 3, stride=2, padding=1, bias=False),\n",
    "            nn.BatchNorm2d(128),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.AvgPool2d(4),\n",
    "        )\n",
    "        self.fc = nn.Sequential(\n",
    "            # reshape input, 128 -> 1\n",
    "            nn.Linear(128, 1),\n",
    "            nn.Sigmoid(),\n",
    "        )\n",
    "    \n",
    "    def forward(self, x, y=None):\n",
    "        y_ = self.conv(x)\n",
    "        y_ = y_.view(y_.size(0), -1)\n",
    "        y_ = self.fc(y_)\n",
    "        return y_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Generator(nn.Module):\n",
    "    \"\"\"\n",
    "        Convolutional Generator for MNIST\n",
    "    \"\"\"\n",
    "    def __init__(self, input_size=100, num_classes=784):\n",
    "        super(Generator, self).__init__()\n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(input_size, 4*4*512),\n",
    "            nn.ReLU(),\n",
    "        )\n",
    "        self.conv = nn.Sequential(\n",
    "            # input: 4 by 4, output: 7 by 7\n",
    "            nn.ConvTranspose2d(512, 256, 3, stride=2, padding=1, bias=False),\n",
    "            nn.BatchNorm2d(256),\n",
    "            nn.ReLU(),\n",
    "            # input: 7 by 7, output: 14 by 14\n",
    "            nn.ConvTranspose2d(256, 128, 4, stride=2, padding=1, bias=False),\n",
    "            nn.BatchNorm2d(128),\n",
    "            nn.ReLU(),\n",
    "            # input: 14 by 14, output: 28 by 28\n",
    "            nn.ConvTranspose2d(128, 1, 4, stride=2, padding=1, bias=False),\n",
    "            nn.Tanh(),\n",
    "        )\n",
    "        \n",
    "    def forward(self, x, y=None):\n",
    "        x = x.view(x.size(0), -1)\n",
    "        y_ = self.fc(x)\n",
    "        y_ = y_.view(y_.size(0), 512, 4, 4)\n",
    "        y_ = self.conv(y_)\n",
    "        return y_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "D = Discriminator().to(DEVICE)\n",
    "G = Generator().to(DEVICE)\n",
    "# D.load_state_dict('D_dc.pkl')\n",
    "# G.load_state_dict('G_dc.pkl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(),\n",
    "                                transforms.Normalize(mean=[0.5],\n",
    "                                std=[0.5])]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mnist = datasets.MNIST(root='../data/', train=True, transform=transform, download=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data_loader = DataLoader(dataset=mnist, batch_size=batch_size, shuffle=True, drop_last=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "criterion = nn.BCELoss()\n",
    "D_opt = torch.optim.Adam(D.parameters(), lr=0.001, betas=(0.5, 0.999))\n",
    "G_opt = torch.optim.Adam(G.parameters(), lr=0.001, betas=(0.5, 0.999))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "max_epoch = 30 # need more than 20 epochs for training generator\n",
    "step = 0\n",
    "n_critic = 1 # for training more k steps about Discriminator\n",
    "n_noise = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "D_labels = torch.ones([batch_size, 1]).to(DEVICE) # Discriminator Label to real\n",
    "D_fakes = torch.zeros([batch_size, 1]).to(DEVICE) # Discriminator Label to fake"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 0/30, Step: 0, D Loss: 1.3901150226593018, G Loss: 0.645667552947998\n",
      "Epoch: 0/30, Step: 500, D Loss: 0.8841016292572021, G Loss: 1.032528042793274\n",
      "Epoch: 1/30, Step: 1000, D Loss: 0.3341742157936096, G Loss: 1.929326057434082\n",
      "Epoch: 1/30, Step: 1500, D Loss: 0.502487063407898, G Loss: 1.8487944602966309\n",
      "Epoch: 2/30, Step: 2000, D Loss: 0.5597702860832214, G Loss: 1.8412060737609863\n",
      "Epoch: 2/30, Step: 2500, D Loss: 0.4319043457508087, G Loss: 1.2376809120178223\n",
      "Epoch: 3/30, Step: 3000, D Loss: 0.5119948387145996, G Loss: 1.7091478109359741\n",
      "Epoch: 3/30, Step: 3500, D Loss: 0.4834495186805725, G Loss: 2.1602656841278076\n",
      "Epoch: 4/30, Step: 4000, D Loss: 0.3906676769256592, G Loss: 2.2380075454711914\n",
      "Epoch: 4/30, Step: 4500, D Loss: 0.57613605260849, G Loss: 1.8952455520629883\n",
      "Epoch: 5/30, Step: 5000, D Loss: 0.37664082646369934, G Loss: 2.319974660873413\n",
      "Epoch: 5/30, Step: 5500, D Loss: 0.46279168128967285, G Loss: 2.153512954711914\n",
      "Epoch: 6/30, Step: 6000, D Loss: 0.4129234254360199, G Loss: 2.554079055786133\n",
      "Epoch: 6/30, Step: 6500, D Loss: 0.33443957567214966, G Loss: 2.8593034744262695\n",
      "Epoch: 7/30, Step: 7000, D Loss: 0.3468945324420929, G Loss: 2.6473114490509033\n",
      "Epoch: 8/30, Step: 7500, D Loss: 0.40650618076324463, G Loss: 1.9287309646606445\n",
      "Epoch: 8/30, Step: 8000, D Loss: 0.6533892154693604, G Loss: 1.7906147241592407\n",
      "Epoch: 9/30, Step: 8500, D Loss: 0.2568785548210144, G Loss: 2.1740102767944336\n",
      "Epoch: 9/30, Step: 9000, D Loss: 0.45188480615615845, G Loss: 1.866640329360962\n",
      "Epoch: 10/30, Step: 9500, D Loss: 0.3194931447505951, G Loss: 1.7600427865982056\n",
      "Epoch: 10/30, Step: 10000, D Loss: 0.5581725239753723, G Loss: 2.1016454696655273\n",
      "Epoch: 11/30, Step: 10500, D Loss: 0.35416218638420105, G Loss: 2.4358558654785156\n",
      "Epoch: 11/30, Step: 11000, D Loss: 0.44659504294395447, G Loss: 1.803159475326538\n",
      "Epoch: 12/30, Step: 11500, D Loss: 0.368685245513916, G Loss: 3.1171088218688965\n",
      "Epoch: 12/30, Step: 12000, D Loss: 0.2865059971809387, G Loss: 1.6171672344207764\n",
      "Epoch: 13/30, Step: 12500, D Loss: 0.5770776271820068, G Loss: 1.3813045024871826\n",
      "Epoch: 13/30, Step: 13000, D Loss: 0.503258466720581, G Loss: 3.088622570037842\n",
      "Epoch: 14/30, Step: 13500, D Loss: 0.3149162232875824, G Loss: 2.2010059356689453\n",
      "Epoch: 14/30, Step: 14000, D Loss: 0.5541285276412964, G Loss: 2.093771457672119\n",
      "Epoch: 15/30, Step: 14500, D Loss: 0.41772717237472534, G Loss: 2.5844826698303223\n",
      "Epoch: 16/30, Step: 15000, D Loss: 0.38224175572395325, G Loss: 1.7165570259094238\n",
      "Epoch: 16/30, Step: 15500, D Loss: 0.38481268286705017, G Loss: 2.179786205291748\n",
      "Epoch: 17/30, Step: 16000, D Loss: 0.2670775055885315, G Loss: 2.555079698562622\n",
      "Epoch: 17/30, Step: 16500, D Loss: 0.4881252348423004, G Loss: 0.6407601237297058\n",
      "Epoch: 18/30, Step: 17000, D Loss: 0.44740352034568787, G Loss: 1.8447380065917969\n",
      "Epoch: 18/30, Step: 17500, D Loss: 0.32545846700668335, G Loss: 1.244987964630127\n",
      "Epoch: 19/30, Step: 18000, D Loss: 0.3907506465911865, G Loss: 2.2971487045288086\n",
      "Epoch: 19/30, Step: 18500, D Loss: 0.4499781131744385, G Loss: 2.0843355655670166\n",
      "Epoch: 20/30, Step: 19000, D Loss: 0.3507501482963562, G Loss: 1.8766827583312988\n",
      "Epoch: 20/30, Step: 19500, D Loss: 0.41672438383102417, G Loss: 2.4048855304718018\n",
      "Epoch: 21/30, Step: 20000, D Loss: 0.31802812218666077, G Loss: 2.2574410438537598\n",
      "Epoch: 21/30, Step: 20500, D Loss: 0.3652912676334381, G Loss: 1.845369577407837\n",
      "Epoch: 22/30, Step: 21000, D Loss: 0.4425152540206909, G Loss: 2.848350763320923\n",
      "Epoch: 22/30, Step: 21500, D Loss: 0.40185287594795227, G Loss: 3.0943799018859863\n",
      "Epoch: 23/30, Step: 22000, D Loss: 0.3489686846733093, G Loss: 2.381059169769287\n",
      "Epoch: 24/30, Step: 22500, D Loss: 0.4847504198551178, G Loss: 1.7365357875823975\n",
      "Epoch: 24/30, Step: 23000, D Loss: 0.4196416735649109, G Loss: 2.341548442840576\n",
      "Epoch: 25/30, Step: 23500, D Loss: 0.3331816494464874, G Loss: 1.4263110160827637\n",
      "Epoch: 25/30, Step: 24000, D Loss: 0.5935764908790588, G Loss: 2.4271726608276367\n",
      "Epoch: 26/30, Step: 24500, D Loss: 0.3213740885257721, G Loss: 2.7648630142211914\n",
      "Epoch: 26/30, Step: 25000, D Loss: 0.6007185578346252, G Loss: 2.2156314849853516\n",
      "Epoch: 27/30, Step: 25500, D Loss: 0.3478204011917114, G Loss: 1.6239631175994873\n",
      "Epoch: 27/30, Step: 26000, D Loss: 0.35690590739250183, G Loss: 2.510906457901001\n",
      "Epoch: 28/30, Step: 26500, D Loss: 0.3491174876689911, G Loss: 2.117020845413208\n",
      "Epoch: 28/30, Step: 27000, D Loss: 0.40436598658561707, G Loss: 2.0063576698303223\n",
      "Epoch: 29/30, Step: 27500, D Loss: 0.4856051802635193, G Loss: 2.291684627532959\n",
      "Epoch: 29/30, Step: 28000, D Loss: 0.2775539457798004, G Loss: 1.694042682647705\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(max_epoch):\n",
    "    for idx, (images, labels) in enumerate(data_loader):\n",
    "        # Training Discriminator\n",
    "        x = images.to(DEVICE)\n",
    "        x_outputs = D(x)\n",
    "        D_x_loss = criterion(x_outputs, D_labels)\n",
    "\n",
    "        z = torch.randn(batch_size, n_noise).to(DEVICE)\n",
    "        z_outputs = D(G(z))\n",
    "        D_z_loss = criterion(z_outputs, D_fakes)\n",
    "        D_loss = D_x_loss + D_z_loss\n",
    "        \n",
    "        D.zero_grad()\n",
    "        D_loss.backward()\n",
    "        D_opt.step()\n",
    "\n",
    "        if step % n_critic == 0:\n",
    "            # Training Generator\n",
    "            z = torch.randn(batch_size, n_noise).to(DEVICE)\n",
    "            z_outputs = D(G(z))\n",
    "            G_loss = criterion(z_outputs, D_labels)\n",
    "\n",
    "            D.zero_grad()\n",
    "            G.zero_grad()\n",
    "            G_loss.backward()\n",
    "            G_opt.step()\n",
    "        \n",
    "        if step % 500 == 0:\n",
    "            print('Epoch: {}/{}, Step: {}, D Loss: {}, G Loss: {}'.format(epoch, max_epoch, step, D_loss.item(), G_loss.item()))\n",
    "        \n",
    "        if step % 1000 == 0:\n",
    "            G.eval()\n",
    "            img = get_sample_image(G, n_noise)\n",
    "            imsave('samples/{}_step{}.jpg'.format(MODEL_NAME, str(step).zfill(3)), img, cmap='gray')\n",
    "            G.train()\n",
    "        step += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x1e152e82630>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e153194128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# generation to image\n",
    "G.eval()\n",
    "imshow(get_sample_image(G, n_noise), cmap='gray')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def save_checkpoint(state, file_name='checkpoint.pth.tar'):\n",
    "    torch.save(state, file_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Saving params.\n",
    "# torch.save(D.state_dict(), 'D_c.pkl')\n",
    "# torch.save(G.state_dict(), 'G_c.pkl')\n",
    "save_checkpoint({'epoch': epoch + 1, 'state_dict':D.state_dict(), 'optimizer' : D_opt.state_dict()}, 'D_dc.pth.tar')\n",
    "save_checkpoint({'epoch': epoch + 1, 'state_dict':G.state_dict(), 'optimizer' : G_opt.state_dict()}, 'G_dc.pth.tar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
